package main.leetcode.competition.lcp.autumn;

/**
 * 小扣在秋日市集发现了一款速算机器人。店家对机器人说出两个数字（记作 x 和 y），请小扣说出计算指令：
 *
 * <p>"A" 运算：使 x = 2 * x + y； "B" 运算：使 y = 2 * y + x。 在本次游戏中，店家说出的数字为 x = 1 和 y =
 * 0，小扣说出的计算指令记作仅由大写字母 A、B 组成的字符串 s，字符串中字符的顺序表示计算顺序，请返回最终 x 与 y 的和为多少。
 *
 * <p>示例 1：输入：s = "AB" 输出：4 解释： 经过一次 A 运算后，x = 2, y = 0。 再经过一次 B 运算，x = 2, y = 2。 最终 x 与 y 之和为 4。
 *
 * <p>提示：0 <= s.length <= 10 s 由 'A' 和 'B' 组成
 */
public class ex1 {
    public static void main(String[] args) {
        System.out.println(new ex1().calculate("AB"));
    }

    /** 数学解法 */
    public int calculate(String s) {
        // A运算后，x = 2 * x0 + y0，此时 x + y = 2x0 + 2y0 = 2 * (x0 + y0)
        // B运算后，y = 2 * y0 + x0，此时 x + y = 2x0 + 2y0 = 2 * (x0 + y0)
        // 由此可见，进行任意一次A运算、B运算后，x + y 的值都会*2，而与A、B的次数与先后顺序都无关
        // 因此答案即为 (x + y) << s.length()
        return 1 << s.length();
    }

    //    private int x = 1;
    //    private int y = 0;
    //
    //    public int calculate(String s) {
    //        for (int i = 0; i < s.length(); i++) {
    //            if ("A".equals(s.charAt(i))) {
    //                A();
    //            } else {
    //                B();
    //            }
    //        }
    //        return x + y;
    //    }
    //
    //    private void A() {
    //        x = 2 * x + y;
    //    }
    //
    //    private void B() {
    //        y = 2 * y + x;
    //    }
}
